package interceptors

import (
	"talent.com/agency_im/common/msg"
	"talent.com/server/durotar.git/log"
)

// 消息处理拦截器，用于业务方自定义消息发送前或者发送后处理自定义业务逻辑
type MessageInterceptor interface {
	// 在消息发送之前执行
	// 如果第一个参数为bool类型，指示拦截器是否继续运行下一个拦截器，还是退出整个流程。
	// 返回true为继续执行，反之终止
	PreHandle(*msg.Message) (bool, error)
	// 在消息发送成功之后执行
	PostHandle(*msg.Message) error
}

var MessageInterceptors = make([]MessageInterceptor, 0)

func ExecAllInterceptorsPreSendMessage(message *msg.Message) (bool, error) {
	for _, it := range MessageInterceptors {
		if toNext, err := it.PreHandle(message); err != nil {
			return false, err
		} else {
			if !toNext {
				return false, nil
			}
		}
	}
	return true, nil
}

func ExecAllInterceptorsPostSendMessage(message *msg.Message) error {
	for i := len(MessageInterceptors); i > 0; i-- {
		if err := MessageInterceptors[i-1].PostHandle(message); err != nil {
			return err
		}
	}
	return nil
}

type TopicLifeCycleListener interface {
	// 用户进入一个会话时，比如进入群聊，私聊窗口
	OnBeginConversation(sourceID uint64, targetID uint64) error
}

var TopicLifeCycleListeners = make([]TopicLifeCycleListener, 0)

func OnBeginConversation(sourceID uint64, targetID uint64) error {
	for _, ls := range TopicLifeCycleListeners {
		if err := ls.OnBeginConversation(sourceID, targetID); err != nil {
			log.Error("execute OnBeginConversation in TopicLifeCycleListener fail, root: %v", err)
			return err
		}
	}
	return nil
}

// 消息处理拦截器，适合业务方在消息实际发送前或者发送后做一些逻辑处理
// 比如这些场景：消息发送频率控制，消息内容敏感词侦测，AI客服自动回复

// 注册消息拦截器
func RegisterMessageInterceptor(interceptor MessageInterceptor) {
	MessageInterceptors = append(MessageInterceptors, interceptor)
}

// 会话生命周期中各关键结点监听

// 注册会话监听器
func RegisterTopicLifeCycleListener(listener TopicLifeCycleListener) {
	TopicLifeCycleListeners = append(TopicLifeCycleListeners, listener)
}
